package main

import (
	"fmt"
)

func main() {
	//bubbleSortMax()
	//bubbleSortMin()
	//queryByOrder()
	binaryQuery()
}

// bubbleSortMax
//
//	@Description: 冒泡排序：正序
func bubbleSortMax() {
	var arr [10]int = [10]int{34, 6, 79, 66, 22, 43, 1, 25, 89, 6}
	fmt.Println("前=", arr)
	var maxNum int = 0
	//排序次数
	for times := 0; times < len(arr)-1; times++ {
		//从第一个开始，将最大的放到最后
		for i := 0; i < len(arr)-1-times; i++ {
			//如果前面的比后面大，则交换
			if arr[i] > arr[i+1] {
				maxNum = arr[i+1]
				arr[i+1] = arr[i]
				arr[i] = maxNum
			}
		}
	}
	fmt.Println("后=", arr)

}

// bubbleSortMin
//
//	@Description: 冒泡排序：倒序
func bubbleSortMin() {
	var arr [10]int = [10]int{34, 6, 79, 66, 22, 43, 1, 25, 89, 6}
	fmt.Println("前=", arr)
	//排序次数
	for times := 0; times < len(arr)-1; times++ {
		var minNum int = 0
		//从最后一个开始，将最小的放在最前面
		for i := len(arr) - 1; i >= times+1; i-- {
			//如果后面一个比 前面一个大，则交换
			if arr[i] > arr[i-1] {
				minNum = arr[i-1]
				arr[i-1] = arr[i]
				arr[i] = minNum
			}
		}
	}
	fmt.Println("后=", arr)
}

// 顺序查找
func queryByOrder() {
	fmt.Println("input:")
	var num int
	fmt.Scanf("%d", &num)
	var arr [10]int = [10]int{34, 6, 79, 66, 22, 43, 1, 25, 89, 6}
	var flag bool
	for i, v := range arr {
		if num == v {
			fmt.Println("index=", i, "v=", v)
			flag = true
			break
		}
	}
	if !flag {
		fmt.Println("NO NO NO")
	}

}

// 二分查找
func binaryQuery() {
	fmt.Println("input:")
	var num int
	fmt.Scanf("%d", &num)
	var arr [10]int = [10]int{1, 6, 6, 22, 25, 34, 43, 66, 79, 89}
	findV(&arr, 0, len(arr)-1, num)

}

// 递归二分查找
//
// findV
//
//	@Description: 递归二分查找，前提是数组是有序的
//	@param arr array
//	@param leftIndex 左索引
//	@param rightIndex 右索引
//	@param num 需要查找的数
func findV(arr *[10]int, leftIndex int, rightIndex int, num int) {
	if rightIndex >= leftIndex {
		middel := (leftIndex + rightIndex) / 2
		if (*arr)[middel] == num {
			fmt.Printf("yes %d %d", (leftIndex+rightIndex)/2, arr[(leftIndex+rightIndex)/2])
			return
		}
		if (*arr)[middel] > num {
			findV(arr, leftIndex, middel-1, num)
		} else {
			findV(arr, middel+1, rightIndex, num)
		}
	} else {
		fmt.Println("no no no")
	}

}
